package com.xy.sqldoc.service;

import com.xy.sqldoc.dto.ExportDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static com.xy.sqldoc.common.Constants.EXPORT_SERVICE_MAP;

@Service
@Slf4j
public class DatabaseDocService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private ExcelExportService excelExportService;

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${sql.query.tables}")
    private String tablesQuery;

    @Value("${sql.query.columns}")
    private String columnsQuery;

    /**
     * 生成数据库文档
     */
    public void generateDatabaseDoc(ExportDto exportDto) {
        log.info("开始生成数据库描述文档...");

        // 获取数据库名称
        String databaseName = extractDatabaseName(dbUrl);

        // 查询所有表信息
        List<Map<String, Object>> tables = getTables();
        if (tables.isEmpty()) {
            log.warn("未找到任何表信息");
            return;
        }

        // 存储所有表的字段信息
        Map<String, List<Map<String, Object>>> tableColumnsMap = new HashMap<>();
        for (Map<String, Object> table : tables) {
            String tableName = (String) table.get("table_name");
            // 查询表字段信息
            List<Map<String, Object>> columns = getTableColumns(tableName);
            // 存储表字段信息
            tableColumnsMap.put(tableName, columns);
        }

        IExportService exportService = EXPORT_SERVICE_MAP.get(exportDto.getExportType());
        exportService.export(databaseName, tables, tableColumnsMap, exportDto.getFileName());

        log.info("数据库文档生成成功，输出路径：{}", excelExportService.outputPath);

        log.info("数据库文档生成完成");
    }

    /**
     * 从URL中提取数据库名称
     */
    private String extractDatabaseName(String url) {
         if (url == null) {
            return "unknown";
        }

        // 使用正则表达式匹配数据库名称
        // 匹配jdbc:postgresql://host:port/database 或 jdbc:postgresql://host:port/database?params格式
        String regex = "jdbc:[^:]+://[^/]+/([^?]+)";;
        Pattern pattern = java.util.regex.Pattern.compile(regex);
        Matcher matcher = pattern.matcher(url);

        if (matcher.find()) {
            return matcher.group(1);
        }

        return "unknown";
    }

    /**
     * 查询数据库所有表信息
     */
    public List<Map<String, Object>> getTables() {
        return jdbcTemplate.queryForList(tablesQuery);
    }

    /**
     * 查询表的所有字段信息
     */
    public List<Map<String, Object>> getTableColumns(String tableName) {
        return jdbcTemplate.queryForList(columnsQuery, tableName);
    }
}